import os
from dotenv import load_dotenv
from urllib.parse import quote_plus

# 加载.env文件
load_dotenv()

class Config:
    """基本配置"""
    SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key-change-in-production')
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    
    # 远程数据库配置
    DB_HOST = os.getenv('DB_HOST', '192.168.186.126')
    DB_PORT = os.getenv('DB_PORT', '5432')
    DB_USER = os.getenv('DB_USER', 'cywq')
    DB_PASSWORD = os.getenv('DB_PASSWORD', '1234567890')
    DB_NAME = os.getenv('DB_NAME', 'xaunke_database')
    
    # 构建数据库URI
    SQLALCHEMY_DATABASE_URI = 'postgresql://{user}:{pw}@{host}:{port}/{db}'.format(
        user=quote_plus(DB_USER),
        pw=quote_plus(DB_PASSWORD),
        host=DB_HOST,
        port=DB_PORT,
        db=quote_plus(DB_NAME)
    )
    
    # JWT配置
    JWT_SECRET_KEY = os.getenv('JWT_SECRET_KEY', SECRET_KEY)
    JWT_ALGORITHM = os.getenv('JWT_ALGORITHM', 'HS256')
    JWT_ACCESS_TOKEN_EXPIRES = int(os.getenv('JWT_ACCESS_TOKEN_EXPIRES', '3600'))  # 1小时
    JWT_REFRESH_TOKEN_EXPIRES = int(os.getenv('JWT_REFRESH_TOKEN_EXPIRES', '604800'))  # 7天
    
    # Redis配置（用于限流）
    REDIS_HOST = os.getenv('REDIS_HOST', 'localhost')
    REDIS_PORT = int(os.getenv('REDIS_PORT', '6379'))
    REDIS_DB = int(os.getenv('REDIS_DB', '0'))
    
    @staticmethod
    def init_app(app):
        pass

class DevelopmentConfig(Config):
    """开发环境配置"""
    DEBUG = True

class TestingConfig(Config):
    """测试环境配置 - 使用独立的内存数据库，不影响实际数据库"""
    TESTING = True
    DEBUG = True
    # 使用内存数据库，完全独立，不会影响实际数据库
    SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
    JWT_SECRET_KEY = 'test-secret-key'
    SECRET_KEY = 'test-secret-key'
    # 测试环境不使用实际的数据库连接池
    # 不继承父类的数据库配置，使用独立的内存数据库

class ProductionConfig(Config):
    """生产环境配置"""
    DEBUG = False

# 配置映射
config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}
